package com.demo.base.observe;

import java.util.ArrayList;
import java.util.List;

/**
 * @author : YU.TAN
 * @date : 2021/10/28 15:55
 * 观察者模式定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被完成业务的更新。
 *
 * 观察者模式属于行为模式，一个对象（被观察者）的状态发生改变，所有的依赖对象（观察者对象）都将得到通知，进行广播通知。它的主要成员就是观察者和被观察者。
 *
 * 被观察者（Observerable）：目标对象，状态发生变化时，将通知所有的观察者。
 * 观察者（observer）：接受被观察者的状态变化通知，执行预先定义的业务。
 *使用场景： 完成某件事情后，异步通知场景。如，登陆成功，发个IM消息等等。
 *
 * 观察者模式使用
 *  一个被观察者的类Observerable ;
 * 多个观察者Observer ；
 * 观察者的差异化实现
 * 经典观察者模式封装：EventBus实战
 */
public class Observerable {

    private List<Observer> observers=new ArrayList<>();

    private int state;

    public int getState(){
        return state;
    }

    public void setState(int state){
        this.state=state;
    }

    /**
     * 新增观察者
     * @param observer 参数
     */
    public void addObserver(Observer observer){
        observers.add(observer);
    }

    /**
     * 移除观察者
     * @param observer 参数
     */
    public void removeObserver(Observer observer){
        observers.remove(observer);
    }

    /**
     * 通知
     * @param state 状态
     */
    public void notifyAllObservers(int state){
        if(state!=1){
            System.out.println("不是通知的状态");
            return ;
        }

        for (Observer observer : observers) {
            observer.doEvent();
        }
    }
}
